package 内存结构.方法区.StringTable;

public class StringTable_intern {
    // intern()将这个字符串对象尝试放入串池，如果有则并不会放入，如果没有则放入串池， 会把串池中的对象返回
    public static void main(String[] args) {

        String s = new String("a") + new String("b");
        // 堆创建对象new String("a")，new String("b")，new String("ab")
        // 此时串池中["a","b"]
        String s2 = s.intern(); //串池中没有ab，放入ab，返回池中对象ab
        // 此时串池中["a","b","ab"]
        System.out.println(s2 == s);  //true
        //这里s是ab
        //s2因为s.intern()，s被放入串池中，s2返回的是s的ab
        //s与s2指向一个对象
        System.out.println( s2 == "ab"); //true
        //"ab"发现串池有一模一样ab，就不会创建新对象,所以为相等
        System.out.println( s == "ab");  //true
        //"ab"发现串池有一模一样ab，就不会创建新对象,所以为相等

        System.out.println("11111111111111111111");
        StringTable_intern stringTable_intern = new StringTable_intern();
        stringTable_intern.main2();
    }

    public  void main2() {

        String x = "ab";
        // 此时串池中["ab"]
        String s = new String("a") + new String("b");
        //堆创建对象new String("a")，new String("b")，new String("ab")
        //此时串池中["ab","a","b"]
        String s2 = s.intern(); //串池中有ab，不会把s创建的对象ab放入,返回的是串池中ab
        System.out.println(s2 == s);  //false
        System.out.println(s2 == x);  //true
        //这里s是ab
        //s2因为s.intern()，s没有被放入串池中，s2返回的是x的ab
        //s与s2指向的不是一个对象，s是s，s2是x
        System.out.println( s == x );  //false
    }
}
